USE [edb_sigar_prd]
GO
/****** Object:  StoredProcedure [dbo].[SP_SIGAR_SINCRONIZAR_FBL3N]    Script Date: 11/14/2014 7:41:20 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_SIGAR_SINCRONIZAR_FBL3N]
	@checkpoint_id bigint
AS
Declare @acreedorId VARCHAR(20)
Declare @numeroDocumento VARCHAR(20)
Declare @sociedadId VARCHAR(20)
Declare @fechaDocumento datetime
Declare @descripcion  VARCHAR(200)
Declare @acreedorNombre VARCHAR(200)
Declare @usuario VARCHAR(255)
Declare @i int = 1


BEGIN TRY;  
	
	      IF EXISTS (
		SELECT *

						FROM SGTM_OPERACION_CUENTA SOC (nolock)
						 WHERE
						   (SOC.NUMERO_DOCUMENTO_COMPRA IS NOT NULL OR SOC.NUMERO_DOCUMENTO_COMPRA!= '') AND SOC.CHECKPOINT_ID=@checkpoint_id
						 AND SOC.CODIGO_CE IN ('0','3') 
						
		)
		BEGIN

				DECLARE documento_cursor4 CURSOR
									FOR
										 
				 SELECT DISTINCT
				   SOC.NUMERO_DOCUMENTO_COMPRA as numeroDocumento,
				   SOC.SOCIEDAD_ID as sociedadId,
				   (CASE WHEN SOC.CODIGO_CE='0' THEN 'NO ENCONTRADO'
						WHEN  SOC.CODIGO_CE='-1' THEN 'NRO PEDIDO NO ESPECIFICADO'
						WHEN SOC.CODIGO_CE='2' THEN 'SINCRONIZADO CON WINSHUTTLE CON OBSERVACIONES'
						WHEN SOC.CODIGO_CE='3' THEN 'SINCRONIZADO CON FBL3N'
						WHEN SOC.CODIGO_CE='1' THEN 'SINCRONIZADO CON WINSHUTTLE'
						ELSE 'NO ESPECIFICADO'
					END
						)  descripcion   

						FROM SGTM_OPERACION_CUENTA SOC (nolock)
						 WHERE
						   (SOC.NUMERO_DOCUMENTO_COMPRA IS NOT NULL OR SOC.NUMERO_DOCUMENTO_COMPRA!= '') AND SOC.CHECKPOINT_ID=@checkpoint_id
						 AND SOC.CODIGO_CE IN ('0','3') 
						 ORDER BY SOC.NUMERO_DOCUMENTO_COMPRA;
;

			OPEN documento_cursor4 FETCH NEXT FROM documento_cursor4 INTO @numeroDocumento,@sociedadId,@descripcion
					WHILE (@@FETCH_STATUS = 0)
					BEGIN
							IF @i % 1000 = 1 
							BEGIN
							--	PRINT 'INICIANDO TRAN GRUPO 1 '
								BEGIN TRANSACTION;    
							END

					SELECT TOP 1 
						 @numeroDocumento =SOC.NUMERO_DOCUMENTO_COMPRA  ,
						 @acreedorId = SOC.ACREEDOR_ID , 
						 @acreedorNombre = SOC.ACREEDOR_RAZON_SOCIAL ,
						 @usuario =  SOC.USUARIO ,   
						 @fechaDocumento =  MIN(SOC.FECHA_CONTABLE) 
						   FROM  
    						 SGTM_OPERACION_CUENTA SOC 
							 WHERE  
							   SOC.CODIGO_CE IN ('0','3') AND
								SOC.CHECKPOINT_ID=@checkpoint_id
								and SOC.NUMERO_DOCUMENTO_COMPRA=@numeroDocumento
								GROUP BY SOC.NUMERO_DOCUMENTO_COMPRA, SOC.ACREEDOR_ID, SOC.ACREEDOR_RAZON_SOCIAL,
								SOC.USUARIO
							   ORDER BY SOC.NUMERO_DOCUMENTO_COMPRA ;

							   	 

						UPDATE SGTM_OPERACION_CUENTA
							SET
							   FECHA_CONTABLE= @fechaDocumento,
							   USUARIO= @usuario,
							   CODIGO_CE='3',
								ACREEDOR_ID= @acreedorId,
							   ACREEDOR_RAZON_SOCIAL= @acreedorNombre
							WHERE
								 CHECKPOINT_ID= @checkpoint_id
								 AND SOCIEDAD_ID = @sociedadId
								 AND  NUMERO_DOCUMENTO_COMPRA= @numeroDocumento

								 

					SET @i = @i + 1;
		
		  -- Commit after each 10,000 row
					IF @i % 1000 = 0
					begin
				--		PRINT 'COMMITENADO GRUPO 1 '+ CONVERT(varchar(10),@i)
					COMMIT;
					end

						FETCH NEXT FROM documento_cursor4 INTO @numeroDocumento,@sociedadId,@descripcion
					END			   
	
					


    IF (@@TRANCOUNT > 0 OR @i < 1000 )
    BEGIN
    	COMMIT TRANSACTION;
   -- 	PRINT 'COMMITENADO RESTO GRUPO 1 '+ CONVERT(varchar(10),@i)
    END	
      
	  			CLOSE documento_cursor4;
					DEALLOCATE documento_cursor4;
								
					end

	

 END TRY
  BEGIN CATCH
    IF (@@TRANCOUNT > 0)
      ROLLBACK TRANSACTION;

    DECLARE 
      @ErrorMessage nvarchar(4000),
      @ErrorNumber int,
      @ErrorSeverity int,
      @ErrorState int,
      @ErrorLine int,
      @ErrorProcedure nvarchar(200);

    -- Assign variables to error-handling functions that 
    -- capture information for RAISERROR.
    SELECT 
        @ErrorNumber = ERROR_NUMBER(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE(),
        @ErrorLine = ERROR_LINE(),
        @ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-');

    -- Building the message string that will contain original
    -- error information.
    SELECT @ErrorMessage = 
        N'Error %d, Level %d, State %d, Procedure %s, Line %d, ' + 
            'Message: '+ ERROR_MESSAGE();

    -- Raise an error: msg_str parameter of RAISERROR will contain
    -- the original error information.
    RAISERROR (
      @ErrorMessage, 
      @ErrorSeverity, 
      1,               
      @ErrorNumber,    -- parameter: original error number.
      @ErrorSeverity,  -- parameter: original error severity.
      @ErrorState,     -- parameter: original error state.
      @ErrorProcedure, -- parameter: original error procedure name.
      @ErrorLine       -- parameter: original error line number.
    );
  END CATCH;